perm filename IMPINT.MAC[IP,SYS] blob
sn#704040 filedate 1983-03-08 generic text, type T, neo UTF8
TITLE IMPINT HARDWARE/SOFTWARE INTERFACE V 1515/515
SUBTTL SUNDBERG/RLS/EAT -- 22-APR-73
SEARCH F,S ;MACRO V50
$RELOC
$LOW
XP VIMPNT,516 ;5.06 VERSION = 1000+5.04 VERSION
;LOCAL REVISION HISTORY
;[96bit] 7-Jul-80, Jim McCool
; Modules effected: S, COMDEV, I, IMPINT, IMPSER, NETCON
; Edit type: Enhancement
; Add the CMU modifications to the ARPAnet code to support
; 96 bit leaders in the HOST-IMP protocol
;END OF LOCAL REVISION HISTORY
ENTRY IMPINT
IMPINT::
; BECAUSE OF ASSEBLY-TIME ERROR IN COMMON (MACRO BUG), ALL MPO...
; VALUES AND LABELS HAVE BEEN CHANGED TO MPP... DK/FEB 75
COMMENT \
INPUT INTERRUPT CHANNEL MUST BE HIGHER PRIORITY THAN
END-OF-MESSAGE CHANNEL
\
SUBTTL DOCUMENTATION
COMMENT \
INTERNAL ROUTINES:
IMPDWN-- TURNS THE HARDWARE OFF AND SETS PDP10 DOWN BIT
IMPIOF-- TURNS OFF INPUT
IMPION-- TURNS ON INPUT
IMPCHK-- CHECKS THE STATUS OF THE HARDWARE. THE RETURN ADDRESS
DEPENDS ON THE STATUS. NO SKIP MEANS THAT THE IMP
IS DEAD. ONE SKIP MEANS THAT IT WAS DEAD BUT IS
APPARENTLY OK NOW. A DOUBLE SKIP MEANS THAT THE
PDP-10 IS QUESTIONABLE. A TRIPLE SKIP MEANS THAT ALL
IS OK.
IMPOUT-- ROUTINE TO START UP THE OUTPUT SECTION. T1 MUST
CONTAIN AN IOWD POINTER TO AN OUTPUT MESSAGE. RETURNS
IMMEDIATELY IF THE HARDWARE IS BUSY AND THE MESSAGE
CANNOT BE TRANSMITTED. THE SKIP RETURN IS TAKEN
IF THE MESSAGE IS BEING TRANSMITTED.
EXTERNAL ROUTINES:
IMPEOM-- CALLED WHEN END-OF-MESSAGE HAS BEEN TRANSMITTED.
IF THERE IS NO MORE OUTPUT, RETURN WITH A POPJ P,.
IF ANOTHER MESSAGE IS TO BE TRANSMITTED, PLACE THE IOWD
POINTER IN T1 AND TAKE THE SKIP RETURN.
IMPOND-- CALLED UPON A RUNOUT OF THE BLKO POINTER. TO APPEND
MORE OUTPUT, RETURN A NEW IOWD POINTER IN T1. OTHER-
WISE, DO NOT ALTER T1.
IMPIN-- CALLED ON THE FIRST WORD OF AN INCOMING MULTIWORD
MESSAGE. T1 CONTAINS THE FIRST WORD. RETURN WITH
A POPJ P, AND T1 LOADED AS FOLLOWS:
IF THE ENTIRE MESSAGE IS TO BE INPUT, T1 SHOULD
CONTAIN A LEGAL IOWD POINTER.
IF THE MESSAGE IS TO BE IGNORED, T1 SHOULD CONTAIN
ANY POSITIVE NUMBER.
IF IT IS DESIRED THAT IMPIN(OR IMPONE, BELOW) BE
CALLED ON THE NEXT INPUT WORD, T1 SHOULD
BE ZEROED.
IMPEIM-- CALLED WHEN AN END-OF-MESSAGE HAS BEEN RECEIVED. T1
CONTAINS THE CURRENT BLKI POINTER.
RETURNS NON-SKIP ALWAYS.
IMPIND-- CALLED WHEN A SUPPLIED INPUT IOWD POINTER RUNS OUT.
THE OLD POINTER(EXPIRED) IS IN T1 (SEE IMPEIM). RETURN WITH
A POPJ P, WITH T1 LOADED AS IN IMPIN, ABOVE.
\
SUBTTL PARAMETERS
;HARDWARE DEFINITIONS
IMP== 550 ;IMP DEVICE NUMBER
;CONI BITS
POWER== 200000 ;IMP INTERFACE TURNED ON
DOWN10==100000 ;PDP-10 WAS DOWN
SICK== 40000 ;IMP WAS DOWN
DEAD== 20000 ;IMP CURRENTLY DOWN
ENDIN== 4000 ;EOM RECEIVED
EMPTY== 200 ;OUTPUT BUFFER EMPTY
FULL== 10 ;INPUT BUFFER FULL
;CONO BITS
CSICK== 200000 ;CLEAR SICK FLAG
DOWN10==100000 ;PDP-10 IS UNHEALTHY
OUTSTP== 40000 ;CLEAR EMPTY FLAG
OUTEND== 20000 ;SEND EOM
GOTEND== 10000 ;ACKNOWLEDGE INPUT EOM
MPEENB== 4000 ;ENABLE PI FIELD FOR ENDIN INTERRUPT
MPPENB== 200 ;ENABLE PI FIELD FOR OUTPUT INTERRUPT
MPIENB== 10 ;ENABLE PI FIELD FOR INPUT INTERRUPT
ALLENB==MPIENB+MPPENB+MPEENB
MPISET==MPIENB+MPIPI## ;SETS THE INPUT CHANNEL
MPESET==MPEENB+MPEPI## ;SETS E-O-M CHANNEL
MPPSET==MPPENB+MPPPI## ;OUTPUT CHANNEL
;MACRO TO DISMISS INTERRUPTS IN VARIOUS WAYS
DEFINE JMPENB(CH) <
JEN @CH'CHL##
>
SUBTTL INTERRUPT CODE
;MPI INTERRUPT SERVICE -- INPUT FROM IMP
MPIINT::CONSO IMP,FULL ;IMP INPUT?
JRST .-1
MPIIN1: SKIPL BLKIPT ;GOOD BLKI?
JRST ONEWRD ;NO
BLKI IMP,BLKIPT ;READ
SKIPA
JMPENB (MPI) ;DISMISS
JSR MPISAV## ;COUNTED OUT
MOVE T1,BLKIPT
CONSZ IMP,ENDIN ;WAS IT THE LAST ANYWAY?
JRST END2 ;YES
PUSHJ P,IMPIND## ;NO. TELL OF RUNOUT
JRST MPIIN2 ;STORE NEW POINTER AND RESUME INPUT
;EITHER FIRST INPUT OR THROWING AWAY DATA
ONEWRD:
conso imp,endin ;[96bit] EOM already on? (1 word long)
SKIPE BLKIPT ;FIRST?
JRST IGNORE ;NO
;[96bit] no one word messages.
;[96bit]CONSZ IMP,ENDIN ;EOM SEEN? (MUST TEST BEFORE DATAI)
;[96bit]JRST ONEIN ;YES
JSR MPISAV##
DATAI IMP,T1 ;GET LEADER
PUSHJ P,IMPIN## ;EXCHANGE FOR BLKI POINTER
MPIIN2: MOVEM T1,BLKIPT
;[96bit] nobody ever uses this information.
;[96bit]SETZM OVERFL ;CLEAR OVERFLOW COUNTER
;[96bit]SKIPLE T1 ;DISCARDING NEXT INPUT?
;[96bit]AOS OVERFL ;YES, START COUNT
POPJ P,
IGNORE: DATAI IMP,DUMMY ;THROW AWAY OVERFLOW DATA
JMPENB (MPI) ;DISMISS
;MPE INTERRUPT SERVICE -- END-OF-MESSAGE
MPEINT::CONSO IMP,ENDIN ;IMP END OF INPUT?
JRST .-1
CONSZ IMP,FULL ;YES, DID INPUT FLAG COME UP JUST NOW?
JRST MPIIN1 ;YES, HANDLE IT FIRST
JSR MPESAV##
;[96bit]SKIPL T1,BLKIPT ;UNDERFLOW?
;[96bit]HRL T1,OVERFL ;NO. PERHAPS OVERFLOW
skipge t1,blkipt ;[96bit] load t1, skip if ingoring input
END2: PUSHJ P,IMPEIM## ;TELL IMP SERVICE
SETZM BLKIPT ;READY FOR NEXT INPUT MESSAGE
;[96bit]SETZM OVERFL
END3: CONO IMP,GOTEND ;RESUME INPUT
POPJ P,
;[96bit] imp-host messages no longer fit in one word: handle
; like buffered input.
;ONEIN: DATAI IMP,T1 ;GET LEADER
;[96bit]PUSHJ P,IMPONE## ;SEND MESSAGE TO IMPSER
;[96bit]JRST END3
;MPP INTERRUPT SERVICE -- OUTPUT TO IMP
MPPINT::CONSO IMP,EMPTY ;IMP OUTPUT?
JRST .-1
SKIPL BLKOPT ;LEGIT IOWD?
JRST DONE ;NO
BLKO IMP,BLKOPT ;YES
JRST .+2 ;BLKO RUNOUT
JMPENB (MPP) ;DISMISS
JSR MPPSAV##
MOVE T1,BLKOPT
PUSHJ P,IMPOND## ;RETURN ANOTHER BLKO POINTER
MOVEM T1,BLKOPT
POPJ P, ;DISMISS INTERRUPT
DONE: SKIPG BLKOPT ;CLEARED?
JRST NONE ;YES
JSR MPPSAV## ;NO
CONO IMP,OUTEND ;SEND EOM
PUSHJ P,IMPEOM## ;TELL IMP SERVICE
SETZ T1, ;QUEUES ARE EMPTY
MOVEM T1,BLKOPT
POPJ P, ;DISMISS
NONE: SETZM OUTACT ;SET INACTIVE
CONO IMP,OUTSTP ;STOP HARDWARE
JMPENB (MPP) ;DISMISS
;LEGAL FLAG STATES:
;BLKOPT: -, +, 0, 0
;OUTACT: -1, -1, -1, 0
;STATE NUMBER: 1, 2, 3, 4
; 1. NORMAL TRANSMISSION IN PROGRESS. OUTPUT REQUESTS
; MUST BE QUEUED.
; 2. OUTPUT BLOCK DONE. EOM ON NEXT INTERRUPT. OUTPUT
; REQUESTS MUST BE QUEUED.
; 3. STOPPING. QUEUES WERE EMPTY. OUTPUT REQUEST MAY
; BE DEPOSITED DIRECTLY IN BLKOPT.
; 4. INACTIVE. HARDWARE MUST BE RESTARTED ON OUTPUT
; REQUESTS.
SUBTTL SUBROUTINES
;HERE TO OUTPUT A BLOCK TO THE IMP
;INTERRUPTS MUST BE DISABLED
;CALL:
; MOVE T1,[IOWD LENGTH,ADDRESS]
; PUSHJ P,IMPOUT
; RETURN HERE IF MUST QUEUE
; HERE IF OUTPUT STARTED
IMPOUT::consz pi,impbts## ;(debug) are the IMPs enabled?
stopcd .+1,DEBUG,IDE ;(debug) imps dangerously enabled.
SKIPE BLKOPT ; ALREADY OUTPUTTING?
POPJ P, ;YES.
JUMPGE T1,CPOPJ1## ;PRETEND OK IF NOTHING THERE
SKIPE OUTACT ;ACTIVE?
JRST IMPOU2 ;YES, JUST STORE NEW BLKOPT
SETOM OUTACT ;FLAG ACTIVE
blko imp,t1 ;[96bit] output the first word
jrst cpopj1 ;[96bit] should never be here, ever.
IMPOU1: CONO IMP,MPPSET ;ENABLE OUTPUT HARDWARE
IMPOU2: MOVEM T1,BLKOPT ;STORE NEW IOWD
JRST CPOPJ1 ;SKIP RETURN
;CODE TO CHECK HARDWARE HEALTH
;CALL:
; PUSHJ P,IMPCHK
; ERROR RETURN ... IMP OR INTERFACE DOWN
; ERROR RETURN ... IMP OR INTERFACE WAS DOWN
; OK RETURN
IMPCHK::MOVEI T4,EMPTY ;ENABLE OUTPUT FLAG TEST
HRRM T4,MPPINT
CONO IMP,MPPSET ;MAKE SURE OUTPUT ON
SKIPE INPON ;WANT INPUT OPEN?
PUSHJ P,IMPION ;YES, MAKE SURE TURNED ON
CONSO IMP,POWER ;POWER DOWN?
POPJ P, ;YES
CONSO IMP,SICK ;INTERFACE ERROR?
JRST CPOPJ2## ;NO, DOUBLE SKIP
CONSZ IMP,DEAD ;IS IT STILL DOWN?
POPJ P, ;YES
CONO IMP,CSICK ;CLEAR FAULT
JRST CPOPJ1 ;AND TAKE SINGLE SKIP
;INITIALIZE DEVICES
;SUBROUTINE TO TURN THE HARDWARE OFF
IMPDWN::CONO IMP,DOWN10+ALLENB;TURN OFF HARDWARE
HLLZS MPPINT ;DISABLE OUTPUT FLAG TEST IN SKIP CHAIN
SETZM OUTACT
SETZM BLKIPT
SETZM BLKOPT
;HERE TO TURN OFF INPUT
IMPIOF::SETZM INPON ;TURN OFF INPUT ACTIVE FLAG
CONO IMP,MPIENB!MPEENB ;TURN OFF INPUT
HLLZS MPIINT ;DISABLE INPUT FLAG TESTS
HLLZS MPEINT
POPJ P,
;HERE TO TURN INPUT ON
IMPION::SETOM INPON ;TURN ON FLAG FOR CLOCK
push p,t1 ; save a scratch
MOVEI t1,FULL ;ENABLE INTERRUPT FLAG TESTS
HRRM t1,MPIINT
MOVEI t1,ENDIN
HRRM t1,MPEINT
pop p,t1 ; restore scratch reg.
CONO IMP,MPISET ;TURN ON INPUT
CONO IMP,MPESET
POPJ P,
$LIT
$LOW
;STORAGE
BLKIPT: 0 ;BLKI POINTER
INPON: 0 ;-1 IF INPUT SHOULD BE ACTIVE
DUMMY: 0 ;PLACE TO PUT DISCARDED INPUT DATA
BLKOPT: 0 ;BLKO POINTER
OUTACT: 0 ;-1 IF OUTPUT IS ACTIVE
END